home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / pbmplus / pgm / fstopgm.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  135 lines

  1. /* fstopgm.c - read a Usenix FaceSaver(tm) file and produce a portable graymap
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include "pgm.h"
  14.  
  15. static int gethexit ARGS(( FILE* ifp ));
  16.  
  17. void
  18. main( argc, argv )
  19. int argc;
  20. char *argv[];
  21.     {
  22.     FILE *ifp;
  23.     register gray **grays, *gP;
  24.     int argn, row;
  25.     register int col;
  26.     int maxval;
  27.     int rows = 0, cols = 0, depth = 0, xrows = 0, xcols = 0, xdepth = 0;
  28. #define STRSIZE 1000
  29.     char buf[STRSIZE], firstname[STRSIZE], lastname[STRSIZE], email[STRSIZE];
  30.  
  31.     pgm_init( &argc, argv );
  32.  
  33.     argn = 1;
  34.  
  35.     if ( argn < argc )
  36.     {
  37.     ifp = pm_openr( argv[argn] );
  38.     argn++;
  39.     }
  40.     else
  41.     ifp = stdin;
  42.  
  43.     if ( argn != argc )
  44.     pm_usage( "[fsfile]" );
  45.  
  46.     /* Read the FaceSaver(tm) header. */
  47.     for ( ; ; )
  48.     {
  49.     if ( fgets( buf, STRSIZE, ifp ) == (char *) 0 )
  50.         pm_error( "error reading header" );
  51.  
  52.     /* Blank line ends header. */
  53.     if ( strlen( buf ) == 1 )
  54.         break;
  55.  
  56.     if ( sscanf( buf, "FirstName: %[^\n]", firstname ) == 1 )
  57.         ;
  58.     else if ( sscanf( buf, "LastName: %[^\n]", lastname ) == 1 )
  59.         ;
  60.     else if ( sscanf( buf, "E-mail: %[^\n]", email ) == 1 )
  61.         ;
  62.     else if ( sscanf( buf, "PicData: %d %d %d\n",
  63.               &cols, &rows, &depth ) == 3 )
  64.         {
  65.         if ( depth != 8 )
  66.         pm_error(
  67.             "can't handle 'PicData' depth other than 8" );
  68.         }
  69.     else if ( sscanf( buf, "Image: %d %d %d\n",
  70.               &xcols, &xrows, &xdepth ) == 3 )
  71.         {
  72.         if ( xdepth != 8 )
  73.         pm_error(
  74.             "can't handle 'Image' depth other than 8" );
  75.         }
  76.     }
  77.     if ( cols <= 0 || rows <= 0 )
  78.     pm_error( "invalid header" );
  79.     maxval = pm_bitstomaxval( depth );
  80.     if ( maxval > PGM_MAXMAXVAL )
  81.     pm_error( "depth is too large - try reconfiguring with PGM_BIGGRAYS" );
  82.     if ( xcols != 0 && xrows != 0 && ( xcols != cols || xrows != rows ) )
  83.     {
  84.     float rowratio, colratio;
  85.  
  86.     rowratio = (float) xrows / (float) rows;
  87.     colratio = (float) xcols / (float) cols;
  88.     pm_message(
  89.         "warning, non-square pixels; to fix do a 'pnmscale -%cscale %g'",
  90.         rowratio > colratio ? 'y' : 'x',
  91.         rowratio > colratio ? rowratio / colratio : colratio / rowratio );
  92.     }
  93.  
  94.     /* Now read the hex bits. */
  95.     grays = pgm_allocarray( cols, rows );
  96.     for ( row = rows - 1; row >= 0; row--)
  97.     {
  98.     for ( col = 0, gP = grays[row]; col < cols; col++, gP++ )
  99.         {
  100.         *gP = gethexit( ifp ) << 4;
  101.         *gP += gethexit( ifp );
  102.         }
  103.     }
  104.     pm_close( ifp );
  105.  
  106.     /* And write out the graymap. */
  107.     pgm_writepgm( stdout, grays, cols, rows, (gray) maxval, 0 );
  108.     pm_close( stdout );
  109.  
  110.     exit( 0 );
  111.     }
  112.  
  113. static int
  114. gethexit( ifp )
  115. FILE *ifp;
  116.     {
  117.     register int i;
  118.     register char c;
  119.  
  120.     for ( ; ; )
  121.     {
  122.     i = getc( ifp );
  123.     if ( i == EOF )
  124.         pm_error( "EOF / read error" );
  125.     c = (char) i;
  126.     if ( c >= '0' && c <= '9' )
  127.         return c - '0';
  128.     else if ( c >= 'A' && c <= 'F' )
  129.         return c - 'A' + 10;
  130.     else if ( c >= 'a' && c <= 'f' )
  131.         return c - 'a' + 10;
  132.     /* Else ignore - whitespace. */
  133.     }
  134.     }
  135.